Supplement 1. Systematic review

PRISMA flowchart

PRISMAstatement::prisma(found = 8002,
       found_other = 7,
       no_dupes = 7187, 
       screened = 7187, 
       screen_exclusions = 6913, 
       full_text = 274,
       full_text_exclusions = 124, 
       qualitative = 144, 
       quantitative = 144,
       width = 800, height = 1200)
## Warning in prisma_graph(found = found, found_other = found_other, no_dupes =
## no_dupes, : After full-text exclusions, a different number of remaining articles
## for qualitative synthesis is stated.

Overall N studies + participants

n_sample = dat.meta.long %>% 
    summarise(n=length(unique(paste(ID_study, Echantillons_indépendants))))

data.frame(n_sample=n_sample, dat_tot)
##     n n_studies n_es n_nexp_out n_exp_out
## 1 153       143  647       8322      8005

N studies (adjustment discarded)

dat.borenstein %>%
    group_by(outcome_RDoC_agg) %>%
    summarise(n_es = sum(trial),
              n_exp = sum(n_exp),
              n_nexp = sum(n_nexp),
              n_study2 = length(unique(ID_study)))
## # A tibble: 4 x 5
##   outcome_RDoC_agg                       n_es n_exp n_nexp n_study2
##   <chr>                                 <dbl> <dbl>  <dbl>    <int>
## 1 Mixed social processes                  223  5847   5506       87
## 2 Reception of facial communication       186  2094   2168       45
## 3 Reception of non-facial communication    28   522    580        9
## 4 Understanding mental states             210  2726   2630       59

N studies (adjustment splitted)

synth_n = dat.borenstein %>%
    group_by(outcome_RDoC) %>%
    summarise(n_es = sum(trial),
              n_exp = sum(n_exp),
              n_nexp = sum(n_nexp),
              nstudy1 = n(),
              n_study2 = length(unique(ID_study)))
synth_n
## # A tibble: 8 x 6
##   outcome_RDoC                                 n_es n_exp n_nexp nstudy1 n_stu~1
##   <chr>                                       <dbl> <dbl>  <dbl>   <int>   <int>
## 1 Mixed social processes (adjusted)              14   277    306       8       8
## 2 Mixed social processes (non-adjusted)         209  5570   5200      82      82
## 3 Reception of facial communication (adjuste~    18   382    511       6       6
## 4 Reception of facial communication (non-adj~   168  1712   1657      42      42
## 5 Reception of non-facial communication (adj~     3   141    254       2       2
## 6 Reception of non-facial communication (non~    25   381    326       8       8
## 7 Understanding mental states (adjusted)         24   245    274       9       9
## 8 Understanding mental states (non-adjusted)    186  2481   2356      55      55
## # ... with abbreviated variable name 1: n_study2
dat.meta.long %>% 
    group_by(outcome_RDoC) %>%
    summarise(n=length(unique(paste(ID_study, Echantillons_indépendants))))
## # A tibble: 8 x 2
##   outcome_RDoC                                             n
##   <chr>                                                <int>
## 1 Mixed social processes (adjusted)                        8
## 2 Mixed social processes (non-adjusted)                   86
## 3 Reception of facial communication (adjusted)             7
## 4 Reception of facial communication (non-adjusted)        44
## 5 Reception of non-facial communication (adjusted)         2
## 6 Reception of non-facial communication (non-adjusted)     8
## 7 Understanding mental states (adjusted)                   9
## 8 Understanding mental states (non-adjusted)              58

Supplement 2. ES visualization

Distribution of ES

ggplot(dat.meta, aes(x = es_adj, y = es)) + 
  geom_jitter(alpha = 0.3, width = 0.35, size = 2) +
    geom_violin(size = 0.5, alpha = 0.5) +
theme_bw() 

Distribution of ES / outcomes

2 plots, tu choisis celui qui tu préfères

ggplot(dat.meta, aes(x = outcome_RDoC_agg, y = es)) + 
       geom_jitter(width = 0.05, dotsize = 0.1, alpha = 0.2, aes(fill = ID)) +        geom_boxplot(trim=FALSE, alpha = 0.6) +
      facet_grid(es_adj ~ "") +
       theme_bw() +
      labs(y = "Standardized mean difference (SMD)", x = "") +
        guides(fill=FALSE) +
       coord_flip()

ggplot(dat.meta, aes(x = outcome_RDoC_agg, y = es)) + 
    geom_violin(aes(fill = outcome_RDoC_agg), alpha = 0.3) +
  geom_jitter(alpha = 0.2, width = 0.1) +
    geom_boxplot(width=0.1)+
    facet_grid(es_adj ~ "") +
    theme_bw() +
    labs(y = "Standardized mean difference (SMD)", x = "") +
    theme(text = element_text(size = 18),
          legend.position = "none",
          axis.title.y = element_text(size=12, face="bold"), 
          axis.title.x = element_text(size=12, face="bold")) +
    coord_flip()  


Supplement 3. Main analysis

Data analysis

V.SCE  <- with(dat.meta,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_RDoC))

# all.equal(dat.meta$se^2, diag(unlist(V.SCE)))

SCE <- metafor::rma.mv(yi = es, V = V.SCE, 
                       data = dat.meta, 
                       mods = ~ outcome_RDoC - 1,
                       random = ~ outcome_RDoC | ID_study,
                       struct = "DIAG",
                       sparse = TRUE)

SCE.ISQ <- metafor::rma.mv(yi = es, V = V.SCE, 
                       data = dat.meta, 
                       mods = ~ outcome_RDoC - 1)
het = function(x, y) {
  i2 = NA
  for (i in 1:nrow(vcov(x))) {
    i2[i] = 100 * (vcov(x)[i,i] - vcov(y)[i,i]) / vcov(x)[i,i]
  }
  return(i2)
}


res.SCE <- data.frame(clubSandwich::coef_test(SCE, vcov = "CR2", cluster = dat.meta$ID_study)) # , cluster = df.ES$researchgroup
res.SCE.ci = data.frame(clubSandwich::conf_int(SCE, vcov = "CR2", cluster = dat.meta$ID_study))
res.SCE$target <- gsub("outcome_RDoC", "", row.names(res.SCE))
res.SCE.ci$target <- gsub("outcome_RDoC", "", row.names(res.SCE.ci))
res.SCE = dplyr::left_join(res.SCE, res.SCE.ci)
res.SCE$tau2 = SCE$tau2
res.SCE$I2 = het(SCE, SCE.ISQ)
res_main <- left_join(res.SCE, dat_RDoC)
## Joining, by = "target"
res_main$p_Satt_bonferroni = res_main$p_Satt * 8
res_main[,c("beta", "SE", "tstat", "df", "p_Satt",
            "p_Satt_bonferroni", "CI_L", "CI_U", "tau2", "I2", 
            "n_studies",    "n_nexp_out" , "n_exp_out")] <- apply(
res_main[,c("beta", "SE", "tstat", "df", "p_Satt",
            "p_Satt_bonferroni", "CI_L", "CI_U", "tau2", "I2", 
            "n_studies",    "n_nexp_out" , "n_exp_out")], 2, function(x) round(x, 3))
DT::datatable(res_main, 
              rownames = FALSE,
              extensions = 'Buttons',
              options = list(  # options
                buttons = c('copy', 'excel'),
                scrollX = TRUE,
                dom = c('ftB'), 
                autoWidth = TRUE,
                columnDefs = list(
                  list(className = 'dt-center', 
                                     targets = "_all"))))

Forest plot

res_main$SE_COR = (res_main$CI_U - res_main$CI_L) / (3.92)

res_main$raw_outcome <- gsub(r"{\s*\([^\)]+\)}","",
                            as.character(res_main$outcome_RDoC))
tab.plot <- data.frame(
  Outcome = do.call(rbind, lapply(res_main$outcome_RDoC, 
                                  function(x) paste(strwrap(x, width = 60), 
                                                    collapse = "\n"))),
  n_ADHD = res_main$n_exp_out,
  n_nexpT = res_main$n_nexp_out,
  n_studies = res_main$n_studies,
  tau2 = res_main$tau2,
  I2 = paste0(round(res_main$I2), "%"))

value_num_plot = data.frame(apply(res_main[, c("beta", "SE_COR")], 2, function(x) as.numeric(as.character(x))))

forest_modif(x = value_num_plot[ ,c("beta", "SE_COR")], 
           variant = "classic",
           col = "Greys", xlab = "SMD", annotate_CI = TRUE,
           study_table = tab.plot,
           group = res_main$raw_outcome,
           type = "study_only",
           text_size = 3.5,
           x_limit = c(-1, 2),
           N = tab.plot$n_ADHD + tab.plot$n_nexpT,
           x_breaks = seq(-3, 3, 1)
           )

Diagnostics

# windows() ## create window to plot your file, eval = FALSE
metafor::profile.rma.mv(SCE)
## Profiling tau2 = 1

## Profiling tau2 = 2

## Profiling tau2 = 3

## Profiling tau2 = 4

## Profiling tau2 = 5

## Profiling tau2 = 6

## Profiling tau2 = 7

## Profiling tau2 = 8

# dev.off()

Supplement 4. Supplementary analyses

S1. Other statistical approaches

A. Borenstein

meta.reg <- metafor::rma.mv(yi = es, V = se^2, 
                           data = dat.borenstein, 
                           random = ~ outcome_RDoC | ID_study,
                           struct = "DIAG",
                           mods = ~ outcome_RDoC - 1)

res.S1.a.clean = data.frame(
  beta = meta.reg$beta,
  se = meta.reg$se,
  ci_lo = meta.reg$ci.lb,
  ci_up = meta.reg$ci.ub,
  pval = meta.reg$pval, 
  target = gsub("outcome_RDoC", "", row.names(meta.reg$b)))

res.S1 <- left_join(res.S1.a.clean, dat_RDoC)
## Joining, by = "target"
DT::datatable(res.S1, 
              rownames = FALSE,
              extensions = 'Buttons',
              options = list(  # options
                buttons = c('copy', 'excel'),
                scrollX = TRUE,
                dom = c('ftB'), 
                autoWidth = TRUE,
                columnDefs = list(
                  list(className = 'dt-center', 
                                     targets = "_all"))))

B. RVE approach

robu.main <- robumeta::robu(es ~ outcome_RDoC - 1, 
                            data = dat.meta, 
                            studynum = ID_study,
                            var.eff.size = se^2,
                            modelweights = "CORR",
                            small = TRUE,
                            rho = 0.8)

dat_robu_main = data.frame(
  beta = robu.main$reg_table$b.r,
  se = robu.main$reg_table$SE,
  ci_lo = robu.main$reg_table$CI.L,
  ci_up = robu.main$reg_table$CI.U,
  pval = robu.main$reg_table$prob, 
  target = gsub("outcome_RDoC", "", row.names(meta.reg$b)),
  target2 = robu.main$reg_table$labels)

DT::datatable(dat_robu_main, 
              rownames = FALSE,
              extensions = 'Buttons',
              options = list(  # options
                buttons = c('copy', 'excel'),
                scrollX = TRUE,
                dom = c('ftB'), 
                autoWidth = TRUE,
                columnDefs = list(
                  list(className = 'dt-center', 
                                     targets = "_all"))))

C. SCE vs RVE vs Borenstein

res.SCE.main = data.frame(
    beta = res.SCE$beta,
    se = res.SCE$SE,
    ci_lo = res.SCE$CI_L,
    ci_up = res.SCE$CI_U,
    pval = res.SCE$p_Satt, 
    target =res.SCE$target)
res.SCE.main$Analysis = "SCE approach"
res.S1.a.clean$Analysis = "Borenstein approach"
dat_robu_main$Analysis = "RVE approach"
dat_forest_S1 = bind_rows(res.SCE.main,
                          res.S1.a.clean,
                          dat_robu_main)


meta_res_tot = meta::metagen(TE = beta, seTE = (ci_up-ci_lo)/(2*qnorm(.975)), 
                             sm = "SMD", data = dat_forest_S1,
                             subgroup = target, 
                             studlab = Analysis)

meta::forest(meta_res_tot, random = FALSE, fixed = FALSE, 
             leftcols = c("studlab"),
             text.subgroup.nohet = FALSE, print.tau2 = FALSE, print.I2 = FALSE, print.pval.Q = FALSE,
             plotwidth = "15cm", colgap.left = "1cm", colgap.right = "1cm",
             leftlabs= c(""),
             just = "right", spacing = 0.8)

S2. Small study effects

A. Nakagawa approach

dat.meta$inv_n_tilda <- with(dat.meta, (n_nexp + n_exp)/(n_nexp*n_exp))
dat.meta$sqrt_inv_n_tilda <- with(dat.meta, sqrt(inv_n_tilda))

nak.pb = metafor::rma.mv(yi = es, V = V.SCE, 
                      data = dat.meta, 
                      mods = ~ 1 + sqrt_inv_n_tilda + outcome_RDoC,
                      random = ~ outcome_RDoC | ID_study,
                      struct = "DIAG",
                      sparse = TRUE)
clubSandwich::coef_test(nak.pb, vcov = "CR2", cluster = dat.meta$ID_study)
##                                                              Coef. Estimate
## 1                                                          intrcpt   0.1186
## 2                                                 sqrt_inv_n_tilda   5.2643
## 3                outcome_RDoCMixed social processes (non-adjusted)  -0.0963
## 4         outcome_RDoCReception of facial communication (adjusted)  -0.8001
## 5     outcome_RDoCReception of facial communication (non-adjusted)  -0.7753
## 6     outcome_RDoCReception of non-facial communication (adjusted)  -0.9654
## 7 outcome_RDoCReception of non-facial communication (non-adjusted)  -0.8645
## 8               outcome_RDoCUnderstanding mental states (adjusted)  -0.8528
## 9           outcome_RDoCUnderstanding mental states (non-adjusted)  -0.6526
##      SE t-stat  d.f. p-val (Satt) Sig.
## 1 0.537  0.221  8.96       0.8300     
## 2 1.950  2.700 17.65       0.0148    *
## 3 0.257 -0.374  8.55       0.7172     
## 4 0.317 -2.520 10.62       0.0291    *
## 5 0.264 -2.938  9.35       0.0159    *
## 6 0.365 -2.643  2.16       0.1091     
## 7 0.292 -2.962 11.74       0.0121    *
## 8 0.316 -2.699  9.79       0.0227    *
## 9 0.257 -2.543  9.26       0.0309    *

B. PET-PEESE approach

PET = metafor::rma.mv(yi = es, V = V.SCE, 
                      data = dat.meta, 
                      mods = ~ se,
                      random = ~ outcome_RDoC | ID_study,
                      struct = "DIAG",
                      sparse = TRUE)
clubSandwich::coef_test(PET, vcov = "CR2", 
                        cluster = dat.meta$ID_study)
##     Coef. Estimate    SE t-stat d.f. p-val (Satt) Sig.
## 1 intrcpt    -2.91 0.452  -6.43 72.7       <0.001  ***
## 2      se    14.52 1.691   8.59 24.5       <0.001  ***
dat.meta$var = dat.meta$se^2
PET = metafor::rma.mv(yi = es, V = V.SCE, 
                      data = dat.meta, 
                      mods = ~ var,
                      random = ~ outcome_RDoC | ID_study,
                      struct = "DIAG",
                      sparse = TRUE)
clubSandwich::coef_test(PET, vcov = "CR2", 
                        cluster = dat.meta$ID_study)
##     Coef. Estimate    SE t-stat d.f. p-val (Satt) Sig.
## 1 intrcpt   -0.865 0.186  -4.64 75.7       <0.001  ***
## 2     var   23.458 2.451   9.57 18.9       <0.001  ***

C. Egger’s test for each outcome

dat_egger = data.frame(
  meta_review = "Haza",
  study = dat.borenstein$ID_study,
  factor = dat.borenstein$outcome_RDoC,
  value = dat.borenstein$es,
  se = dat.borenstein$se,
  n_cases = dat.borenstein$n_exp,
  n_controls = dat.borenstein$n_nexp,
  measure = "G")
  
umb = metaumbrella::umbrella(dat_egger)
## Analyzing factor: Understanding mental states (non-adjusted) 
## Analyzing factor: Mixed social processes (non-adjusted) 
## Analyzing factor: Mixed social processes (adjusted) 
## Analyzing factor: Understanding mental states (adjusted)
## - An error occured when converting the standard error of G to SMD. The standard error of the SMD was assumed to be equal to 'sqrt(1/n_cases + 1/n_controls)'.
## Analyzing factor: Reception of facial communication (non-adjusted) 
## Analyzing factor: Reception of non-facial communication (non-adjusted)
## - An error occured when converting the standard error of G to SMD. The standard error of the SMD was assumed to be equal to 'sqrt(1/n_cases + 1/n_controls)'.
## Analyzing factor: Reception of facial communication (adjusted) 
## Analyzing factor: Reception of non-facial communication (adjusted)
umb
## 
## Umbrella review:
##                                                 Factor n_studies total_n
## 1           Understanding mental states (non-adjusted)        55    4837
## 2                Mixed social processes (non-adjusted)        82   10770
## 3                    Mixed social processes (adjusted)         8     583
## 4               Understanding mental states (adjusted)         9     519
## 5     Reception of facial communication (non-adjusted)        42    3369
## 6 Reception of non-facial communication (non-adjusted)         8     707
## 7         Reception of facial communication (adjusted)         6     893
## 8     Reception of non-facial communication (adjusted)         2     395
##   n_cases n_controls measure value        value_CI    eG           eG_CI   eOR
## 1    2481       2356       G 0.799  [0.655, 0.944] 0.799  [0.655, 0.944] 4.263
## 2    5570       5200       G 1.077  [0.928, 1.226] 1.077  [0.928, 1.226] 7.050
## 3     277        306       G 1.257  [0.607, 1.908] 1.257  [0.607, 1.908] 9.782
## 4     245        274       G 0.879  [0.455, 1.304] 0.879  [0.455, 1.304] 4.928
## 5    1712       1657       G 0.802  [0.623, 0.981] 0.802  [0.623, 0.981] 4.283
## 6     381        326       G 0.985  [0.602, 1.369] 0.985  [0.602, 1.369] 5.970
## 7     382        511       G 0.420    [0.21, 0.63] 0.420    [0.21, 0.63] 2.142
## 8     141        254       G 0.344 [-0.057, 0.744] 0.344 [-0.057, 0.744] 1.865
##            eOR_CI  p_value     I2           PI_eG          PI_eOR     egger_p
## 1  [3.278, 5.544] 2.91e-27 83.349  [-0.181, 1.78]  [0.72, 25.238]    4.53e-01
## 2   [5.379, 9.24] 1.84e-45 89.243  [-0.206, 2.36] [0.688, 72.219]    3.76e-04
## 3 [3.008, 31.817] 1.51e-04 91.236 [-1.084, 3.598] [0.14, 683.241]    2.73e-01
## 4 [2.283, 10.638] 4.87e-05 79.000 [-0.607, 2.366] [0.332, 73.042]    1.45e-01
## 5  [3.097, 5.923] 1.45e-18 85.782 [-0.287, 1.891] [0.594, 30.875]    2.95e-01
## 6  [2.978, 11.97] 4.78e-07 80.392 [-0.288, 2.258] [0.594, 60.052]    7.73e-01
## 7  [1.463, 3.136] 9.09e-05 53.229 [-0.182, 1.022]  [0.719, 6.381]    7.37e-01
## 8  [0.902, 3.853] 9.24e-02 47.744     < 3 studies     < 3 studies < 3 studies
##      ESB_p power_med     JK_p   largest_CI_eG  largest_CI_eOR rob amstar
## 1 9.91e-01     100.0 5.44e-26 [-0.304, 0.449]  [0.576, 2.258]  NA     NA
## 2 1.57e-01     100.0 4.14e-44 [-0.154, 0.883]  [0.757, 4.957]  NA     NA
## 3 6.73e-01     100.0 1.53e-03  [0.623, 1.315] [3.095, 10.864]  NA     NA
## 4 3.78e-01     100.0 3.44e-04  [0.271, 0.939]  [1.634, 5.494]  NA     NA
## 5 7.20e-01     100.0 1.69e-17  [1.259, 1.804] [9.804, 26.348]  NA     NA
## 6 3.54e-01     100.0 3.14e-05  [0.967, 1.419] [5.776, 13.118]  NA     NA
## 7 4.24e-01     100.0 4.52e-03   [0.218, 1.22]   [1.484, 9.15]  NA     NA
## 8     <NA>      99.7 6.41e-01  [0.165, 0.879]  [1.348, 4.928]  NA     NA

S3. Type of publication

A. Overall

dat.meta4 = subset(dat.meta, Type_publication %in% 
                     c("Article", "Thèse"))
V.SCE4  <- with(dat.meta4,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_RDoC))

SCE.S4 <- metafor::rma.mv(yi = es, V = V.SCE4, 
                       data = dat.meta4, 
                       mods = ~ Type_publication,
                       random = ~ outcome_RDoC | ID_study,
                       struct = "DIAG",
                       sparse = TRUE)

clubSandwich::coef_test(SCE.S4, vcov = "CR2", cluster = dat.meta4$ID_study)
##                   Coef. Estimate     SE t-stat d.f. p-val (Satt) Sig.
## 1               intrcpt   0.8392 0.0536 15.644 88.8       <0.001  ***
## 2 Type_publicationThèse   0.0605 0.1208  0.501 13.2        0.625
SCE.S4 <- metafor::rma.mv(yi = es, V = V.SCE4, 
                       data = dat.meta4, 
                       mods = ~ Type_publication - 1,
                       random = ~ outcome_RDoC | ID_study,
                       struct = "DIAG",
                       sparse = TRUE)
clubSandwich::coef_test(SCE.S4, vcov = "CR2", cluster = dat.meta4$ID_study)
##                     Coef. Estimate     SE t-stat d.f. p-val (Satt) Sig.
## 1 Type_publicationArticle    0.839 0.0536  15.64 88.8       <0.001  ***
## 2   Type_publicationThèse    0.900 0.1082   8.31 10.2       <0.001  ***

B. Mixed social processes

dat.meta4 = subset(dat.meta, Type_publication %in% 
                     c("Article", "Thèse") & outcome_RDoC == "Mixed social processes (non-adjusted)")
dat.meta4$var = dat.meta4$se^2
SCE.S4 <- metafor::rma.mv(yi = es, V = var, 
                       data = dat.meta4, 
                       mods = ~ Type_publication,
                       random = ~ outcome_RDoC | ID_study,
                       struct = "DIAG",
                       sparse = TRUE)

clubSandwich::coef_test(SCE.S4, vcov = "CR2", cluster = dat.meta4$ID_study)
##                   Coef. Estimate     SE t-stat d.f. p-val (Satt) Sig.
## 1               intrcpt    1.091 0.0703  15.51 68.3       <0.001  ***
## 2 Type_publicationThèse    0.322 0.1726   1.86 11.3       0.0885    .
SCE.S4 <- metafor::rma.mv(yi = es, V = var, 
                       data = dat.meta4, 
                       mods = ~ Type_publication - 1,
                       random = ~ outcome_RDoC | ID_study,
                       struct = "DIAG",
                       sparse = TRUE)
clubSandwich::coef_test(SCE.S4, vcov = "CR2", cluster = dat.meta4$ID_study)
##                     Coef. Estimate     SE t-stat  d.f. p-val (Satt) Sig.
## 1 Type_publicationArticle     1.09 0.0703  15.51 68.30       <0.001  ***
## 2   Type_publicationThèse     1.41 0.1576   8.96  8.85       <0.001  ***

C. Understanding mental states

dat.meta4 = subset(dat.meta, Type_publication %in% 
                     c("Article", "Thèse") & outcome_RDoC == "Understanding mental states (non-adjusted)")
dat.meta4$var = dat.meta4$se^2
SCE.S4 <- metafor::rma.mv(yi = es, V = var, 
                       data = dat.meta4, 
                       mods = ~ Type_publication,
                       random = ~ outcome_RDoC | ID_study,
                       struct = "DIAG",
                       sparse = TRUE)

clubSandwich::coef_test(SCE.S4, vcov = "CR2", cluster = dat.meta4$ID_study)
##                   Coef. Estimate     SE t-stat  d.f. p-val (Satt) Sig.
## 1               intrcpt    0.791 0.0783 10.105 44.66       <0.001  ***
## 2 Type_publicationThèse   -0.195 0.1975 -0.986  8.84         0.35
SCE.S4 <- metafor::rma.mv(yi = es, V = var, 
                       data = dat.meta4, 
                       mods = ~ Type_publication - 1,
                       random = ~ outcome_RDoC | ID_study,
                       struct = "DIAG",
                       sparse = TRUE)
clubSandwich::coef_test(SCE.S4, vcov = "CR2", cluster = dat.meta4$ID_study)
##                     Coef. Estimate     SE t-stat  d.f. p-val (Satt) Sig.
## 1 Type_publicationArticle    0.791 0.0783  10.10 44.66       <0.001  ***
## 2   Type_publicationThèse    0.597 0.1813   3.29  6.68       0.0142    *

S4. Effect of rob

dat.meta.S10 = subset(dat.meta, !is.na(rob_tot) & outcome_RDoC %in% unique(synth_n$outcome_RDoC[synth_n$nstudy1 > 20]))
V.SCE.S10  <- with(dat.meta.S10,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_RDoC))


SCE.S10 <- metafor::rma.mv(yi = es, V = V.SCE.S10, 
                          data = dat.meta.S10, 
                          mods = ~ rob_tot * outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S10, vcov = "CR2", cluster = dat.meta.S10$ID_study)
##                                                                  Coef. Estimate
## 1                                                              intrcpt  1.13282
## 2                                                              rob_tot  0.01513
## 3         outcome_RDoCReception of facial communication (non-adjusted) -1.07371
## 4               outcome_RDoCUnderstanding mental states (non-adjusted) -0.48000
## 5 rob_tot:outcome_RDoCReception of facial communication (non-adjusted)  0.07767
## 6       rob_tot:outcome_RDoCUnderstanding mental states (non-adjusted)  0.00839
##       SE t-stat  d.f. p-val (Satt) Sig.
## 1 0.2725  4.156  5.60      0.00695   **
## 2 0.0474  0.319  4.05      0.76560     
## 3 0.4356 -2.465 21.11      0.02237    *
## 4 0.2795 -1.717  6.39      0.13365     
## 5 0.0739  1.051 19.70      0.30594     
## 6 0.0486  0.173  5.14      0.86950
anova(SCE.S10, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 1.6488, p-val = 0.4385
SCE.S10 <- metafor::rma.mv(yi = es, V = V.SCE.S10, 
                          data = dat.meta.S10, 
                          mods = ~ rob_tot + outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S10, vcov = "CR2", cluster = dat.meta.S10$ID_study)
##                                                          Coef. Estimate     SE
## 1                                                      intrcpt    1.064 0.1624
## 2                                                      rob_tot    0.027 0.0274
## 3 outcome_RDoCReception of facial communication (non-adjusted)   -0.587 0.1064
## 4       outcome_RDoCUnderstanding mental states (non-adjusted)   -0.433 0.1054
##   t-stat d.f. p-val (Satt) Sig.
## 1  6.548 11.5       <0.001  ***
## 2  0.985  6.4         0.36     
## 3 -5.517 88.3       <0.001  ***
## 4 -4.105 99.4       <0.001  ***
ggplot(dat.meta.S10, aes(x = rob_tot, y = es)) +
    facet_wrap(~outcome_RDoC) +
    geom_point(size = 2, alpha = 0.2) + 
    geom_smooth() + #method ="lm"
    theme_bw()

S5. Type of tools

dat.meta.S11 = subset(dat.meta, !is.na(Type_mesure) & outcome_RDoC== "Understanding mental states (non-adjusted)")
dat.meta.S11$vi = dat.meta.S11$se^2
dat.meta.S11$es_id = 1:nrow(dat.meta.S11)
SCE.S11 <- metafor::rma.mv(yi = es, V = vi, 
                          data = dat.meta.S11, 
                          mods = ~ Type_mesure ,
                          random = ~ 1 | ID_study/es_id)
clubSandwich::coef_test(SCE.S11, vcov = "CR2", cluster = dat.meta.S11$ID_study)
##               Coef. Estimate     SE t-stat d.f. p-val (Satt) Sig.
## 1           intrcpt    0.741 0.0723  10.25 48.5       <0.001  ***
## 2 Type_mesureReport    0.229 0.1935   1.18 11.9         0.26
SCE.S11wi <- metafor::rma.mv(yi = es, V = vi, 
                          data = dat.meta.S11, 
                          mods = ~ Type_mesure - 1,
                          random = ~ 1 | ID_study/es_id)
clubSandwich::coef_test(SCE.S11wi, vcov = "CR2", cluster = dat.meta.S11$ID_study)
##                 Coef. Estimate     SE t-stat d.f. p-val (Satt) Sig.
## 1 Type_mesureParadigm    0.741 0.0723  10.25 48.5       <0.001  ***
## 2   Type_mesureReport    0.970 0.1960   4.95 13.4       <0.001  ***

S6. Each facial emotion

Data analysis

dat.meta.S5 = subset(dat.meta, 
    emot_spec %in% c("Happy", "Sad", "Surprise", "Fear", "Disgust", "Anger") & 
      grepl("Reception of facial", dat.meta$outcome_RDoC, fixed = TRUE) & 
      !grepl("(adjusted)", dat.meta$outcome_RDoC, fixed = TRUE))

V.SCE.S5  <- with(dat.meta.S5,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study,
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = emot_spec))

# all.equal(dat.meta$se^2, diag(unlist(V.SCE)))

SCE.S5 <- metafor::rma.mv(yi = es, V = V.SCE.S5, 
                       data = dat.meta.S5, 
                       mods = ~ emot_spec - 1,
                       random = ~ emot_spec | ID_study,
                       struct = "DIAG",
                       sparse = TRUE)

SCE.ISQ.S5 <- metafor::rma.mv(yi = es, V = V.SCE.S5, 
                               data = dat.meta.S5, 
                               mods = ~ emot_spec - 1)

res.SCE.S5 <- data.frame(clubSandwich::coef_test(SCE.S5, vcov = "CR2", cluster = dat.meta.S5$ID_study)) # , cluster = df.ES$researchgroup
res.SCE.ci.S5 = data.frame(clubSandwich::conf_int(SCE.S5, vcov = "CR2", cluster = dat.meta.S5$ID_study))
res.SCE.S5$emot_spec <- gsub("emot_spec", "", row.names(res.SCE.S5))
res.SCE.ci.S5$emot_spec <- gsub("emot_spec", "", row.names(res.SCE.ci.S5))
res.SCE.S5 = dplyr::left_join(res.SCE.S5, res.SCE.ci.S5)
## Joining, by = c("beta", "SE", "df", "emot_spec")
res.SCE.S5$I2 = het(SCE.S5, SCE.ISQ.S5)
res.SCE.S5$tau2 = SCE.S5$tau2

res.SCE.clean.S5 = subset(res.SCE.S5, SE > 0.000001)

Table

dat_emot$emot_spec = dat_emot$Nom_sousdim_clean
res_S5 <- left_join(res.SCE.clean.S5, dat_emot)
## Joining, by = "emot_spec"
res_S5[,c("beta", "SE", "tstat", "df", "p_Satt", "CI_L", "CI_U", "I2", "n_studies",    "n_nexp_out" , "n_exp_out")] <- apply(res_S5[,c("beta", "SE", "tstat", "df", "p_Satt", "CI_L", "CI_U", "I2", "n_studies",    "n_nexp_out" , "n_exp_out")], 2, function(x) round(x, 3))
DT::datatable(res_S5, 
              rownames = FALSE,
              options = list(  # options
                scrollX = TRUE,
                dom = c('ft'), 
                autoWidth = TRUE,
                columnDefs = list(
                  list(className = 'dt-center', 
                                     targets = "_all"))))

Forest plot

res_S5$raw_outcome <- gsub(r"{\s*\([^\)]+\)}","",
                            as.character(res_S5$Nom_sousdim_clean))
tab.plot.S5 <- data.frame(
  Outcome = do.call(rbind, lapply(res_S5$Nom_sousdim_clean, 
                                  function(x) paste(strwrap(x, width = 60), 
                                                    collapse = "\n"))),
  n_ADHD = res_S5$n_exp_out,
  n_nexpT = res_S5$n_nexp_out,
  n_studies = res_S5$n_studies,
  I2 = paste0(round(res_S5$I2), "%"))

value_num_plot_S5 = data.frame(apply(res_S5[, c("beta", "SE")], 2, function(x) as.numeric(as.character(x))))

forest_modif(x = value_num_plot_S5[ ,c("beta", "SE")], 
           variant = "classic",
           col = "Greys", xlab = "SMD", annotate_CI = TRUE,
           study_table = tab.plot.S5,
           group = res_S5$raw_outcome,
           type = "study_only",
           text_size = 3.5,
           x_limit = c(-1, 2),
           N = tab.plot.S5$n_ADHD + tab.plot.S5$n_nexpT,
           x_breaks = seq(-3, 3, 1)
           )

S7. Effect of age

a. Age

dat.meta.S6 = subset(dat.meta, !is.na(age) & outcome_RDoC %in% unique(synth_n$outcome_RDoC[synth_n$nstudy1 > 20]))
V.SCE.S6  <- with(dat.meta.S6,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_RDoC))


SCE.S6 <- metafor::rma.mv(yi = es, V = V.SCE.S6, 
                          data = dat.meta.S6, 
                          mods = ~ age * outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S6, vcov = "CR2", cluster = dat.meta.S6$ID_study)
##                                                              Coef. Estimate
## 1                                                          intrcpt  1.26246
## 2                                                              age -0.00415
## 3     outcome_RDoCReception of facial communication (non-adjusted) -0.44699
## 4           outcome_RDoCUnderstanding mental states (non-adjusted) -0.24692
## 5 age:outcome_RDoCReception of facial communication (non-adjusted) -0.01131
## 6       age:outcome_RDoCUnderstanding mental states (non-adjusted) -0.01557
##       SE  t-stat d.f. p-val (Satt) Sig.
## 1 1.0326  1.2226 17.7        0.237     
## 2 0.0994 -0.0418 15.5        0.967     
## 3 1.1470 -0.3897 32.4        0.699     
## 4 1.2986 -0.1901 36.0        0.850     
## 5 0.1105 -0.1023 26.5        0.919     
## 6 0.1244 -0.1252 31.3        0.901
anova(SCE.S6, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 0.1316, p-val = 0.9363
SCE.S6 <- metafor::rma.mv(yi = es, V = V.SCE.S6, 
                          data = dat.meta.S6, 
                          mods = ~ age + outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S6, vcov = "CR2", cluster = dat.meta.S6$ID_study)
##                                                          Coef. Estimate     SE
## 1                                                      intrcpt   1.3459 0.4465
## 2                                                          age  -0.0123 0.0417
## 3 outcome_RDoCReception of facial communication (non-adjusted)  -0.5645 0.1048
## 4       outcome_RDoCUnderstanding mental states (non-adjusted)  -0.4103 0.1036
##   t-stat  d.f. p-val (Satt) Sig.
## 1  3.014  44.8      0.00423   **
## 2 -0.295  33.5      0.76953     
## 3 -5.384  86.5      < 0.001  ***
## 4 -3.961 100.3      < 0.001  ***
ggplot(dat.meta.S6, aes(x = age, y = es)) +
    facet_wrap(~outcome_RDoC) +
    geom_point(size = 2, alpha = 0.2) + 
    geom_smooth(method ="lm") +
    theme_bw()

b. Age diff

dat.meta.S6 = subset(dat.meta, !is.na(age_diff) & outcome_RDoC %in% unique(synth_n$outcome_RDoC[synth_n$nstudy1 > 20]))
V.SCE.S6  <- with(dat.meta.S6,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_RDoC))


SCE.S6 <- metafor::rma.mv(yi = es, V = V.SCE.S6, 
                          data = dat.meta.S6, 
                          mods = ~ age_diff * outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S6, vcov = "CR2", cluster = dat.meta.S6$ID_study)
##                                                                   Coef.
## 1                                                               intrcpt
## 2                                                              age_diff
## 3          outcome_RDoCReception of facial communication (non-adjusted)
## 4                outcome_RDoCUnderstanding mental states (non-adjusted)
## 5 age_diff:outcome_RDoCReception of facial communication (non-adjusted)
## 6       age_diff:outcome_RDoCUnderstanding mental states (non-adjusted)
##   Estimate     SE  t-stat   d.f. p-val (Satt) Sig.
## 1  1.21622 0.0785 15.4931  79.23       <0.001  ***
## 2 -0.05515 0.2292 -0.2406   3.44        0.823     
## 3 -0.55690 0.1106 -5.0361  87.49       <0.001  ***
## 4 -0.41372 0.1064 -3.8869 101.97       <0.001  ***
## 5 -0.04965 0.2488 -0.1996   5.46        0.849     
## 6  0.00925 0.2552  0.0362   5.55        0.972
anova(SCE.S6, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 1.7257, p-val = 0.4220
SCE.S6 <- metafor::rma.mv(yi = es, V = V.SCE.S6, 
                          data = dat.meta.S6, 
                          mods = ~ age_diff + outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S6, vcov = "CR2", cluster = dat.meta.S6$ID_study)
##                                                          Coef. Estimate     SE
## 1                                                      intrcpt   1.2157 0.0760
## 2                                                     age_diff  -0.0624 0.0584
## 3 outcome_RDoCReception of facial communication (non-adjusted)  -0.5612 0.1082
## 4       outcome_RDoCUnderstanding mental states (non-adjusted)  -0.4132 0.1050
##   t-stat   d.f. p-val (Satt) Sig.
## 1  15.99  79.29       <0.001  ***
## 2  -1.07   6.71        0.323     
## 3  -5.19  88.52       <0.001  ***
## 4  -3.93 101.94       <0.001  ***
ggplot(dat.meta.S6, aes(x = age_diff, y = es)) +
    facet_wrap(~outcome_RDoC) +
    geom_point(size = 2, alpha = 0.2) + 
    geom_smooth() +
    theme_bw()

S8. Effect of comorbidities

a. ASD

dat.meta.S7_a = subset(dat.meta, !is.na(percentage_ASD) & outcome_RDoC %in% unique(synth_n$outcome_RDoC[synth_n$nstudy1 > 20]) & percentage_ASD %in% c(0,100))
dat.meta.S7_a$percentage_ASD = factor(dat.meta.S7_a$percentage_ASD)
V.SCE.S7_a  <- with(dat.meta.S7_a,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_RDoC))


SCE.S7_a <- metafor::rma.mv(yi = es, V = V.SCE.S7_a, 
                          data = dat.meta.S7_a, 
                          mods = ~ percentage_ASD * outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S7_a, vcov = "CR2", cluster = dat.meta.S7_a$ID_study)
##                                                                            Coef.
## 1                                                                        intrcpt
## 2                                                              percentage_ASD100
## 3                   outcome_RDoCReception of facial communication (non-adjusted)
## 4                         outcome_RDoCUnderstanding mental states (non-adjusted)
## 5 percentage_ASD100:outcome_RDoCReception of facial communication (non-adjusted)
## 6       percentage_ASD100:outcome_RDoCUnderstanding mental states (non-adjusted)
##   Estimate     SE t-stat  d.f. p-val (Satt) Sig.
## 1    1.333 0.0961  13.88 45.40      < 0.001  ***
## 2    1.059 0.2195   4.82  4.62      0.00588   **
## 3   -0.765 0.1375  -5.57 50.26      < 0.001  ***
## 4   -0.524 0.1413  -3.71 55.82      < 0.001  ***
## 5   -0.979 0.2187  -4.48  2.62      0.02762    *
## 6   -0.752 0.2507  -3.00  3.48      0.04775    *
anova(SCE.S7_a, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 187.9798, p-val < .0001
SCE.S7_a_ph = metafor::rma.mv(yi = es, V = V.SCE.S7_a, 
                data = dat.meta.S7_a, 
                mods = ~ percentage_ASD : outcome_RDoC - 1,
                random = ~ outcome_RDoC | ID_study,
                struct = "DIAG",
                sparse = TRUE)
SCE.S7_a_ph
## 
## Multivariate Meta-Analysis Model (k = 376; method: REML)
## 
## Variance Components:
## 
## outer factor: ID_study     (nlvls = 76)
## inner factor: outcome_RDoC (nlvls = 3)
## 
##             estim    sqrt  k.lvl  fixed 
## tau^2.1    0.3634  0.6028    120     no 
## tau^2.2    0.2202  0.4693    131     no 
## tau^2.3    0.2980  0.5459    125     no 
##                                                       level 
## tau^2.1               Mixed social processes (non-adjusted) 
## tau^2.2    Reception of facial communication (non-adjusted) 
## tau^2.3          Understanding mental states (non-adjusted) 
## 
## Test for Residual Heterogeneity:
## QE(df = 370) = 6343.8250, p-val < .0001
## 
## Test of Moderators (coefficients 1:6):
## QM(df = 6) = 801.6536, p-val < .0001
## 
## Model Results:
## 
##                                                                                 estimate 
## percentage_ASD0:outcome_RDoCMixed social processes (non-adjusted)                 1.3334 
## percentage_ASD100:outcome_RDoCMixed social processes (non-adjusted)               2.3923 
## percentage_ASD0:outcome_RDoCReception of facial communication (non-adjusted)      0.5682 
## percentage_ASD100:outcome_RDoCReception of facial communication (non-adjusted)    0.6484 
## percentage_ASD0:outcome_RDoCUnderstanding mental states (non-adjusted)            0.8093 
## percentage_ASD100:outcome_RDoCUnderstanding mental states (non-adjusted)          1.1162 
##                                                                                     se 
## percentage_ASD0:outcome_RDoCMixed social processes (non-adjusted)               0.0963 
## percentage_ASD100:outcome_RDoCMixed social processes (non-adjusted)             0.1062 
## percentage_ASD0:outcome_RDoCReception of facial communication (non-adjusted)    0.1043 
## percentage_ASD100:outcome_RDoCReception of facial communication (non-adjusted)  0.1190 
## percentage_ASD0:outcome_RDoCUnderstanding mental states (non-adjusted)          0.1046 
## percentage_ASD100:outcome_RDoCUnderstanding mental states (non-adjusted)        0.1158 
##                                                                                    zval 
## percentage_ASD0:outcome_RDoCMixed social processes (non-adjusted)               13.8460 
## percentage_ASD100:outcome_RDoCMixed social processes (non-adjusted)             22.5282 
## percentage_ASD0:outcome_RDoCReception of facial communication (non-adjusted)     5.4476 
## percentage_ASD100:outcome_RDoCReception of facial communication (non-adjusted)   5.4502 
## percentage_ASD0:outcome_RDoCUnderstanding mental states (non-adjusted)           7.7362 
## percentage_ASD100:outcome_RDoCUnderstanding mental states (non-adjusted)         9.6390 
##                                                                                   pval 
## percentage_ASD0:outcome_RDoCMixed social processes (non-adjusted)               <.0001 
## percentage_ASD100:outcome_RDoCMixed social processes (non-adjusted)             <.0001 
## percentage_ASD0:outcome_RDoCReception of facial communication (non-adjusted)    <.0001 
## percentage_ASD100:outcome_RDoCReception of facial communication (non-adjusted)  <.0001 
## percentage_ASD0:outcome_RDoCUnderstanding mental states (non-adjusted)          <.0001 
## percentage_ASD100:outcome_RDoCUnderstanding mental states (non-adjusted)        <.0001 
##                                                                                  ci.lb 
## percentage_ASD0:outcome_RDoCMixed social processes (non-adjusted)               1.1447 
## percentage_ASD100:outcome_RDoCMixed social processes (non-adjusted)             2.1842 
## percentage_ASD0:outcome_RDoCReception of facial communication (non-adjusted)    0.3638 
## percentage_ASD100:outcome_RDoCReception of facial communication (non-adjusted)  0.4152 
## percentage_ASD0:outcome_RDoCUnderstanding mental states (non-adjusted)          0.6043 
## percentage_ASD100:outcome_RDoCUnderstanding mental states (non-adjusted)        0.8892 
##                                                                                  ci.ub 
## percentage_ASD0:outcome_RDoCMixed social processes (non-adjusted)               1.5222 
## percentage_ASD100:outcome_RDoCMixed social processes (non-adjusted)             2.6005 
## percentage_ASD0:outcome_RDoCReception of facial communication (non-adjusted)    0.7727 
## percentage_ASD100:outcome_RDoCReception of facial communication (non-adjusted)  0.8816 
## percentage_ASD0:outcome_RDoCUnderstanding mental states (non-adjusted)          1.0144 
## percentage_ASD100:outcome_RDoCUnderstanding mental states (non-adjusted)        1.3432 
##  
## percentage_ASD0:outcome_RDoCMixed social processes (non-adjusted)               *** 
## percentage_ASD100:outcome_RDoCMixed social processes (non-adjusted)             *** 
## percentage_ASD0:outcome_RDoCReception of facial communication (non-adjusted)    *** 
## percentage_ASD100:outcome_RDoCReception of facial communication (non-adjusted)  *** 
## percentage_ASD0:outcome_RDoCUnderstanding mental states (non-adjusted)          *** 
## percentage_ASD100:outcome_RDoCUnderstanding mental states (non-adjusted)        *** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(SCE.S7_a_ph, L=c(-1,1,0,0,0,0))
## 
## Hypothesis:                                                                                                                                                
## 1: -percentage_ASD0:outcome_RDoCMixed social processes (non-adjusted) + percentage_ASD100:outcome_RDoCMixed social processes (non-adjusted) = 0 
## 
## Results:
##    estimate     se    zval   pval 
## 1:   1.0589 0.0499 21.2047 <.0001 
## 
## Test of Hypothesis:
## QM(df = 1) = 449.6405, p-val < .0001
anova(SCE.S7_a_ph, L=c(0,0,-1,1,0,0))
## 
## Hypothesis:                                                                                                                                                                      
## 1: -percentage_ASD0:outcome_RDoCReception of facial communication (non-adjusted) + percentage_ASD100:outcome_RDoCReception of facial communication (non-adjusted) = 0 
## 
## Results:
##    estimate     se   zval   pval 
## 1:   0.0801 0.0594 1.3495 0.1772 
## 
## Test of Hypothesis:
## QM(df = 1) = 1.8212, p-val = 0.1772
anova(SCE.S7_a_ph, L=c(0,0,0,0,-1,1))
## 
## Hypothesis:                                                                                                                                                          
## 1: -percentage_ASD0:outcome_RDoCUnderstanding mental states (non-adjusted) + percentage_ASD100:outcome_RDoCUnderstanding mental states (non-adjusted) = 0 
## 
## Results:
##    estimate     se   zval   pval 
## 1:   0.3069 0.0520 5.9049 <.0001 
## 
## Test of Hypothesis:
## QM(df = 1) = 34.8673, p-val < .0001

b. ODD/CD

dat.meta.S7_b = subset(dat.meta, !is.na(percentage_CD_ODD) & outcome_RDoC %in% unique(synth_n$outcome_RDoC[synth_n$nstudy1 > 20]))
dat.meta.S7_b$percentage_CD_ODD = as.numeric(as.character(dat.meta.S7_b$percentage_CD_ODD))
V.SCE.S7_b  <- with(dat.meta.S7_b,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_RDoC))


SCE.S7_b <- metafor::rma.mv(yi = es, V = V.SCE.S7_b, 
                          data = dat.meta.S7_b, 
                          mods = ~ percentage_CD_ODD * outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S7_b, vcov = "CR2", cluster = dat.meta.S7_b$ID_study)
##                                                                            Coef.
## 1                                                                        intrcpt
## 2                                                              percentage_CD_ODD
## 3                   outcome_RDoCReception of facial communication (non-adjusted)
## 4                         outcome_RDoCUnderstanding mental states (non-adjusted)
## 5 percentage_CD_ODD:outcome_RDoCReception of facial communication (non-adjusted)
## 6       percentage_CD_ODD:outcome_RDoCUnderstanding mental states (non-adjusted)
##   Estimate      SE t-stat  d.f. p-val (Satt) Sig.
## 1  1.24897 0.12779   9.77 35.43      < 0.001  ***
## 2  0.00381 0.00237   1.61  1.20      0.32339     
## 3 -0.57724 0.16979  -3.40 50.73      0.00132   **
## 4 -0.38735 0.16563  -2.34 50.38      0.02336    *
## 5 -0.00349 0.00283  -1.23  1.74      0.35823     
## 6 -0.00473 0.00256  -1.85  1.68      0.22971
anova(SCE.S7_b, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 18.3078, p-val = 0.0001
SCE.S7_b_ph = metafor::rma.mv(yi = es, V = V.SCE.S7_b, 
                data = dat.meta.S7_b, 
                mods = ~ percentage_CD_ODD : outcome_RDoC - 1,
                random = ~ outcome_RDoC | ID_study,
                struct = "DIAG",
                sparse = TRUE)
clubSandwich::coef_test(SCE.S7_b_ph, vcov = "CR2", cluster = dat.meta.S7_b$ID_study)
##                                                                            Coef.
## 1            percentage_CD_ODD:outcome_RDoCMixed social processes (non-adjusted)
## 2 percentage_CD_ODD:outcome_RDoCReception of facial communication (non-adjusted)
## 3       percentage_CD_ODD:outcome_RDoCUnderstanding mental states (non-adjusted)
##    Estimate      SE t-stat d.f. p-val (Satt) Sig.
## 1  0.004147 0.00196  2.112 1.14        0.257     
## 2  0.000432 0.00153  0.282 2.25        0.801     
## 3 -0.000504 0.00102 -0.496 1.27        0.692
ggplot(dat.meta.S7_b, aes(x = percentage_CD_ODD, y = es)) +
    facet_wrap(~outcome_RDoC) +
    geom_point(size = 2, alpha = 0.2) + 
    geom_smooth(method ="lm") +
    theme_bw()

S9. Effect of sex

dat.meta.S8 = subset(dat.meta, !is.na(sex) & outcome_RDoC %in% unique(synth_n$outcome_RDoC[synth_n$nstudy1 > 20]))
dat.meta.S8$sex = as.numeric(as.character(dat.meta.S8$sex))
dat.meta.S8$sex[dat.meta.S8$sex > 100] <- NA
V.SCE.S8  <- with(dat.meta.S8,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_RDoC))


SCE.S8 <- metafor::rma.mv(yi = es, V = V.SCE.S8, 
                          data = dat.meta.S8, 
                          mods = ~ sex * outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S8, vcov = "CR2", cluster = dat.meta.S8$ID_study)
##                                                              Coef. Estimate
## 1                                                          intrcpt  1.44135
## 2                                                              sex -0.00777
## 3     outcome_RDoCReception of facial communication (non-adjusted) -0.86490
## 4           outcome_RDoCUnderstanding mental states (non-adjusted) -0.66746
## 5 sex:outcome_RDoCReception of facial communication (non-adjusted)  0.00958
## 6       sex:outcome_RDoCUnderstanding mental states (non-adjusted)  0.00833
##        SE t-stat  d.f. p-val (Satt) Sig.
## 1 0.18176  7.930 26.89      < 0.001  ***
## 2 0.00627 -1.240  5.45      0.26564     
## 3 0.26480 -3.266 22.45      0.00347   **
## 4 0.22285 -2.995 29.13      0.00555   **
## 5 0.00971  0.986 10.41      0.34637     
## 6 0.00715  1.164 11.80      0.26740
anova(SCE.S8, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 6.7788, p-val = 0.0337
SCE.S8 <- metafor::rma.mv(yi = es, V = V.SCE.S8, 
                          data = dat.meta.S8, 
                          mods = ~ sex + outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S8, vcov = "CR2", cluster = dat.meta.S8$ID_study)
##                                                          Coef. Estimate      SE
## 1                                                      intrcpt  1.34897 0.13682
## 2                                                          sex -0.00448 0.00448
## 3 outcome_RDoCReception of facial communication (non-adjusted) -0.60894 0.11600
## 4       outcome_RDoCUnderstanding mental states (non-adjusted) -0.44989 0.10744
##   t-stat d.f. p-val (Satt) Sig.
## 1   9.86 54.6       <0.001  ***
## 2  -1.00 11.2        0.338     
## 3  -5.25 71.0       <0.001  ***
## 4  -4.19 90.5       <0.001  ***
ggplot(dat.meta.S8, aes(x = sex, y = es)) +
    facet_wrap(~outcome_RDoC) +
    geom_point(size = 2, alpha = 0.2) + 
    geom_smooth(method ="lm") +
    theme_bw()

S10. Effect of IQ

a. IQ

dat.meta.S9 = subset(dat.meta, !is.na(iq) & outcome_RDoC %in% unique(synth_n$outcome_RDoC[synth_n$nstudy1 > 20]))
dat.meta.S9$iq = as.numeric(as.character(dat.meta.S9$iq))
# dat.meta.S9$iq[dat.meta.S9$iq > 100] <- NA
V.SCE.S9  <- with(dat.meta.S9,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_RDoC))


SCE.S9 <- metafor::rma.mv(yi = es, V = V.SCE.S9, 
                          data = dat.meta.S9, 
                          mods = ~ iq * outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S9, vcov = "CR2", cluster = dat.meta.S9$ID_study)
##                                                             Coef.  Estimate
## 1                                                         intrcpt -0.904696
## 2                                                              iq  0.020699
## 3    outcome_RDoCReception of facial communication (non-adjusted)  2.137153
## 4          outcome_RDoCUnderstanding mental states (non-adjusted) -0.646296
## 5 iq:outcome_RDoCReception of facial communication (non-adjusted) -0.026903
## 6       iq:outcome_RDoCUnderstanding mental states (non-adjusted)  0.000924
##       SE  t-stat d.f. p-val (Satt) Sig.
## 1 7.2554 -0.1247 5.69        0.905     
## 2 0.0697  0.2969 5.82        0.777     
## 3 7.5143  0.2844 8.29        0.783     
## 4 9.2993 -0.0695 5.41        0.947     
## 5 0.0722 -0.3728 8.34        0.719     
## 6 0.0892  0.0104 5.28        0.992
anova(SCE.S9, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 2.2610, p-val = 0.3229
SCE.S9 <- metafor::rma.mv(yi = es, V = V.SCE.S9, 
                          data = dat.meta.S9, 
                          mods = ~ iq + outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S9, vcov = "CR2", cluster = dat.meta.S9$ID_study)
##                                                          Coef. Estimate     SE
## 1                                                      intrcpt  -0.3227 3.9968
## 2                                                           iq   0.0151 0.0385
## 3 outcome_RDoCReception of facial communication (non-adjusted)  -0.6526 0.1537
## 4       outcome_RDoCUnderstanding mental states (non-adjusted)  -0.5448 0.1387
##    t-stat  d.f. p-val (Satt) Sig.
## 1 -0.0807  9.77        0.937     
## 2  0.3924  9.79        0.703     
## 3 -4.2470 43.58       <0.001  ***
## 4 -3.9290 45.10       <0.001  ***
ggplot(dat.meta.S9, aes(x = iq, y = es)) +
    facet_wrap(~outcome_RDoC) +
    geom_point(size = 2, alpha = 0.2) + 
    geom_smooth(method ="lm") +
    theme_bw()

b. IQ diff

dat.meta.S9 = subset(dat.meta, !is.na(iq_diff) & outcome_RDoC %in% unique(synth_n$outcome_RDoC[synth_n$nstudy1 > 20]))
dat.meta.S9$iq_diff = as.numeric(as.character(dat.meta.S9$iq_diff))


SCE.S9 <- metafor::rma.mv(yi = es, V = V.SCE.S9, 
                          data = dat.meta.S9, 
                          mods = ~ iq_diff * outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S9, vcov = "CR2", cluster = dat.meta.S9$ID_study)
##                                                                  Coef.
## 1                                                              intrcpt
## 2                                                              iq_diff
## 3         outcome_RDoCReception of facial communication (non-adjusted)
## 4               outcome_RDoCUnderstanding mental states (non-adjusted)
## 5 iq_diff:outcome_RDoCReception of facial communication (non-adjusted)
## 6       iq_diff:outcome_RDoCUnderstanding mental states (non-adjusted)
##    Estimate     SE   t-stat  d.f. p-val (Satt) Sig.
## 1  1.363368 0.4047  3.36917 29.97      0.00209   **
## 2  0.013140 0.0441  0.29812  5.39      0.77676     
## 3 -0.790680 0.4146 -1.90726 37.65      0.06414    .
## 4 -0.554209 0.4759 -1.16447 33.85      0.25238     
## 5 -0.017017 0.0468 -0.36396  3.35      0.73768     
## 6  0.000401 0.0545  0.00737  5.85      0.99437
anova(SCE.S9, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 2.2257, p-val = 0.3286
SCE.S9 <- metafor::rma.mv(yi = es, V = V.SCE.S9, 
                          data = dat.meta.S9, 
                          mods = ~ iq_diff + outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S9, vcov = "CR2", cluster = dat.meta.S9$ID_study)
##                                                          Coef. Estimate     SE
## 1                                                      intrcpt   1.3423 0.2553
## 2                                                      iq_diff   0.0107 0.0246
## 3 outcome_RDoCReception of facial communication (non-adjusted)  -0.7065 0.1910
## 4       outcome_RDoCUnderstanding mental states (non-adjusted)  -0.5525 0.1400
##   t-stat  d.f. p-val (Satt) Sig.
## 1  5.257 33.28       <0.001  ***
## 2  0.436  8.51        0.674     
## 3 -3.698 43.75       <0.001  ***
## 4 -3.948 44.93       <0.001  ***
ggplot(dat.meta.S9, aes(x = iq_diff, y = es)) +
    facet_wrap(~outcome_RDoC) +
    geom_point(size = 2, alpha = 0.2) + 
    geom_smooth(method ="lm") +
    theme_bw()

S11. ADHD presentation

a. Inattentive

dat.meta.S12.a = subset(dat.meta, !is.na(percentage_inattentive) & outcome_RDoC %in% unique(synth_n$outcome_RDoC[synth_n$nstudy1 > 20]))
dat.meta.S12.a$percentage_inattentive = as.numeric(as.character(dat.meta.S12.a$percentage_inattentive))
V.SCE.S12.a  <- with(dat.meta.S12.a,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_RDoC))


SCE.S12.a <- metafor::rma.mv(yi = es, V = V.SCE.S12.a, 
                          data = dat.meta.S12.a, 
                          mods = ~ percentage_inattentive * outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S12.a, vcov = "CR2", cluster = dat.meta.S12.a$ID_study)
##                                                                                 Coef.
## 1                                                                             intrcpt
## 2                                                              percentage_inattentive
## 3                        outcome_RDoCReception of facial communication (non-adjusted)
## 4                              outcome_RDoCUnderstanding mental states (non-adjusted)
## 5 percentage_inattentive:outcome_RDoCReception of facial communication (non-adjusted)
## 6       percentage_inattentive:outcome_RDoCUnderstanding mental states (non-adjusted)
##    Estimate       SE  t-stat  d.f. p-val (Satt) Sig.
## 1  1.33e+00 0.113388 11.6973 33.72      < 0.001  ***
## 2 -2.86e-03 0.000694 -4.1235  1.13      0.12849     
## 3 -5.50e-01 0.204845 -2.6863 14.61      0.01721    *
## 4 -4.72e-01 0.168141 -2.8044 41.71      0.00762   **
## 5 -7.51e-05 0.005913 -0.0127  8.43      0.99017     
## 6  3.66e-03 0.000899  4.0764  1.12      0.13271
anova(SCE.S12.a, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 33.4410, p-val < .0001
SCE.S12.a <- metafor::rma.mv(yi = es, V = V.SCE.S12.a, 
                          data = dat.meta.S12.a, 
                          mods = ~ percentage_inattentive:outcome_RDoC - 1,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S12.a, vcov = "CR2", cluster = dat.meta.S12.a$ID_study)
##                                                                                 Coef.
## 1            percentage_inattentive:outcome_RDoCMixed social processes (non-adjusted)
## 2 percentage_inattentive:outcome_RDoCReception of facial communication (non-adjusted)
## 3       percentage_inattentive:outcome_RDoCUnderstanding mental states (non-adjusted)
##    Estimate       SE t-stat d.f. p-val (Satt) Sig.
## 1 -0.002799 0.000795  -3.52 1.13       0.1538     
## 2  0.013239 0.005376   2.46 7.34       0.0418    *
## 3  0.000975 0.000331   2.95 1.05       0.1992
ggplot(dat.meta.S12.a, aes(x = percentage_inattentive, y = es)) +
    facet_wrap(~outcome_RDoC) +
    geom_point(size = 2, alpha = 0.2) + 
    geom_smooth(method ="lm") +
    theme_bw()

b. Hyperactive

dat.meta.S12.b = subset(dat.meta, !is.na(percentage_hyperactive) & outcome_RDoC %in% unique(synth_n$outcome_RDoC[synth_n$nstudy1 > 20]))
dat.meta.S12.b$percentage_hyperactive = as.numeric(as.character(dat.meta.S12.b$percentage_hyperactive))
V.SCE.S12.b  <- with(dat.meta.S12.b,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_RDoC))


SCE.S12.b <- metafor::rma.mv(yi = es, V = V.SCE.S12.b, 
                          data = dat.meta.S12.b, 
                          mods = ~ percentage_hyperactive * outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S12.b, vcov = "CR2", cluster = dat.meta.S12.b$ID_study)
##                                                                                 Coef.
## 1                                                                             intrcpt
## 2                                                              percentage_hyperactive
## 3                        outcome_RDoCReception of facial communication (non-adjusted)
## 4                              outcome_RDoCUnderstanding mental states (non-adjusted)
## 5 percentage_hyperactive:outcome_RDoCReception of facial communication (non-adjusted)
## 6       percentage_hyperactive:outcome_RDoCUnderstanding mental states (non-adjusted)
##    Estimate     SE t-stat  d.f. p-val (Satt) Sig.
## 1  1.260353 0.1580  7.978 32.46       <0.001  ***
## 2  0.000807 0.0106  0.076  1.16       0.9504     
## 3 -0.606438 0.2032 -2.984 35.80       0.0051   **
## 4 -0.432498 0.2143 -2.018 40.58       0.0502    .
## 5  0.003804 0.0120  0.317  1.61       0.7878     
## 6  0.006235 0.0195  0.320  1.94       0.7798
anova(SCE.S12.b, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 2.6712, p-val = 0.2630
SCE.S12.b <- metafor::rma.mv(yi = es, V = V.SCE.S12.b, 
                          data = dat.meta.S12.b, 
                          mods = ~ percentage_hyperactive+outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S12.b, vcov = "CR2", cluster = dat.meta.S12.b$ID_study)
##                                                          Coef. Estimate      SE
## 1                                                      intrcpt  1.25097 0.13739
## 2                                       percentage_hyperactive  0.00177 0.00721
## 3 outcome_RDoCReception of facial communication (non-adjusted) -0.57155 0.16800
## 4       outcome_RDoCUnderstanding mental states (non-adjusted) -0.38331 0.16787
##   t-stat  d.f. p-val (Satt) Sig.
## 1  9.105 32.74      < 0.001  ***
## 2  0.246  1.52      0.83500     
## 3 -3.402 39.13      0.00155   **
## 4 -2.283 42.44      0.02748    *
ggplot(dat.meta.S12.b, aes(x = percentage_hyperactive, y = es)) +
    facet_wrap(~outcome_RDoC) +
    geom_point(size = 2, alpha = 0.2) + 
    geom_smooth(method ="lm") +
    theme_bw()

c. Combined

dat.meta.S12.c = subset(dat.meta, !is.na(percentage_combined) & outcome_RDoC %in% unique(synth_n$outcome_RDoC[synth_n$nstudy1 > 20]))
dat.meta.S12.c$percentage_combined = as.numeric(as.character(dat.meta.S12.c$percentage_combined))
V.SCE.S12.c  <- with(dat.meta.S12.c,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_RDoC))


SCE.S12.c <- metafor::rma.mv(yi = es, V = V.SCE.S12.c, 
                          data = dat.meta.S12.c, 
                          mods = ~ percentage_combined * outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S12.c, vcov = "CR2", cluster = dat.meta.S12.c$ID_study)
##                                                                              Coef.
## 1                                                                          intrcpt
## 2                                                              percentage_combined
## 3                     outcome_RDoCReception of facial communication (non-adjusted)
## 4                           outcome_RDoCUnderstanding mental states (non-adjusted)
## 5 percentage_combined:outcome_RDoCReception of facial communication (non-adjusted)
## 6       percentage_combined:outcome_RDoCUnderstanding mental states (non-adjusted)
##   Estimate       SE t-stat  d.f. p-val (Satt) Sig.
## 1  1.05997 0.129152  8.207 31.17       <0.001  ***
## 2  0.00298 0.000578  5.154  1.06       0.1110     
## 3 -0.26144 0.339580 -0.770  7.55       0.4648     
## 4 -0.12509 0.182362 -0.686 37.05       0.4970     
## 5 -0.00462 0.004235 -1.090  7.46       0.3097     
## 6 -0.00389 0.000623 -6.232  1.12       0.0831    .
anova(SCE.S12.c, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 38.0168, p-val < .0001
SCE.S12.c <- metafor::rma.mv(yi = es, V = V.SCE.S12.c, 
                          data = dat.meta.S12.c, 
                          mods = ~ percentage_combined+outcome_RDoC,
                          random = ~ outcome_RDoC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S12.c, vcov = "CR2", cluster = dat.meta.S12.c$ID_study)
##                                                          Coef. Estimate
## 1                                                      intrcpt  1.15551
## 2                                          percentage_combined  0.00153
## 3 outcome_RDoCReception of facial communication (non-adjusted) -0.55775
## 4       outcome_RDoCUnderstanding mental states (non-adjusted) -0.36555
##         SE t-stat  d.f. p-val (Satt) Sig.
## 1 0.123538   9.35 32.70      < 0.001  ***
## 2 0.000438   3.50  1.13      0.15445     
## 3 0.166051  -3.36 39.26      0.00175   **
## 4 0.169476  -2.16 42.64      0.03669    *
ggplot(dat.meta.S12.c, aes(x = percentage_combined, y = es)) +
    facet_wrap(~outcome_RDoC) +
    geom_point(size = 2, alpha = 0.2) + 
    geom_smooth(method ="lm") +
    theme_bw()